#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File   : e_multiprocessing_many.py
# @Email  : xuexia_xu@feidee.com
# @Time   : 2024/4/2 14:59
# @Desc   : 启动大量的子进程，可以用进程池的方式批量创建子进程

import os
import random
import time
from multiprocessing import Pool


def long_time_task(name):
    print('Run task %s (%s)...' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print('Task %s runs %0.2f seconds.' % (name, (end - start)))


if __name__ == '__main__':
    print('Parent process %s.' % os.getpid())
    # 最多同时执行4个进程， task 4要等待前面某个task完成后才执行
    p = Pool(4)
    for i in range(5):
        p.apply_async(long_time_task, args=(i,))
    print('Waiting for all subprocesses done...')
    p.close()
    # 对Pool对象调用join()方法会等待所有子进程执行完毕，
    # 调用join()之前必须先调用close()，调用close()之后就不能继续添加新的Process了
    p.join()
    print('All subprocesses done.')
